home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / beav_132 / part02 / fileio.c < prev    next >
C/C++ Source or Header  |  1991-11-13  |  5KB  |  303 lines

  1. /*
  2. *    file I/O.
  3. */
  4.  
  5. #ifdef UNIX
  6. #include    <sys/types.h> 
  7. #include    <fcntl.h> 
  8. #include    <sys/stat.h> 
  9. #endif
  10. #ifdef AMIGA
  11. #include    <sys/types.h> 
  12. #include    <fcntl.h> 
  13. #include    <sys/stat.h> 
  14. #endif
  15. #include        "def.h"
  16.  
  17. extern    char    MSG_cnt_wr[];
  18. extern    char    MSG_wr_io_er[];
  19. extern    char    MSG_rd_er[];
  20. extern    char    MSG_bak[];
  21. extern    char    MSG_backup[];
  22. extern    char    MSG_back_er[];
  23. extern    char    MSG_back_of[];
  24.  
  25. #ifdef MSDOS
  26. static  FILE * ffp;
  27. #endif
  28.  
  29. #ifdef UNIX
  30. static  int ffp;
  31. #endif
  32.  
  33. #ifdef AMIGA
  34. static  int ffp;
  35. #endif
  36.  
  37. /*
  38. * Open a file for reading.
  39. */
  40. char    ffropen (fn)
  41. char   *fn;
  42. {
  43. #ifdef MSDOS
  44.     if ((ffp = fopen (fn, "rb")) == NULL)/* pvr */
  45.         return (FIOERR);
  46.     ;
  47.     return (FIOSUC);
  48. #endif
  49. #ifdef UNIX
  50.     if ((ffp = open (fn, O_RDONLY)) == -1)/* pvr */
  51.         return (FIOERR);
  52.     ;
  53.     return (FIOSUC);
  54. #endif
  55. #ifdef AMIGA
  56.     if ((ffp = open (fn, O_RDONLY)) == -1)/* pvr */
  57.         return (FIOERR);
  58.     ;
  59.     return (FIOSUC);
  60. #endif
  61. }
  62. /*
  63. *   Get the file length
  64. */
  65. #ifdef AMIGA
  66. A32 file_len(char *fname)
  67. {
  68.     struct stat st;
  69.  
  70.     if (stat (fname, &st) == -1)
  71.         return (-1);
  72.     return (st.st_size);
  73. }
  74. #else /* AMIGA */
  75. A32 file_len ()
  76. {
  77. #ifdef MSDOS
  78.     return (filelength (fileno (ffp)));
  79. #endif
  80. #ifdef UNIX
  81.     struct    stat    st;
  82.  
  83.     if (fstat (ffp, &st) == -1)
  84.         return (-1);
  85.     return (st.st_size);
  86. #endif
  87. }
  88. #endif    /* AMIGA */
  89.  
  90. /*
  91. * Open a file for writing.
  92. * Set file permissions as requested 
  93. * Return TRUE if all is well, and
  94. * FALSE on error (cannot create).
  95. */
  96. char    ffwopen (fn, mode)
  97. char   *fn;
  98. ushort    mode;
  99. {
  100. #ifdef MSDOS
  101.     if ((ffp = fopen (fn, "wb")) == NULL)/* pvr */
  102.     {
  103.         err_echo (MSG_cnt_wr);
  104.         return (FIOERR);
  105.     }
  106.     return (FIOSUC);
  107. #endif
  108. #ifdef UNIX
  109.     /* set perms as in original file 1.31 */
  110.     if ((ffp = open (fn, O_WRONLY | O_CREAT, mode)) == -1)/* pvr */
  111.         return (FIOERR);
  112.     ;
  113.     return (FIOSUC);
  114. #endif
  115. #ifdef AMIGA
  116.     /* set perms as in original file 1.31 */
  117.     if ((ffp = open (fn, O_WRONLY | O_CREAT, mode)) == -1)/* pvr */
  118.         return (FIOERR);
  119.     ;
  120.     return (FIOSUC);
  121. #endif
  122. }
  123.  
  124. /*
  125. * Close a file.
  126. * Should look at the status.
  127. */
  128. char    ffclose ()
  129. {
  130. #ifdef MSDOS
  131.     fclose (ffp);
  132. #endif
  133. #ifdef UNIX
  134.     close (ffp);
  135. #endif
  136.     return (FIOSUC);
  137. #ifdef AMIGA
  138.     close (ffp);
  139. #endif
  140.     return (FIOSUC);
  141. }
  142.  
  143. /*
  144. * Write a line to the already
  145. * opened file. The "buf" points to the
  146. * buffer, and the "nbuf" is its length.   pvr
  147. * Return the status.
  148. */
  149. char    ffputline (buf, nbuf)
  150. register char   buf[];
  151. int     nbuf;
  152. {
  153.     register int    i;
  154.  
  155. #ifdef MSDOS
  156.     i = fwrite (buf, 1, nbuf, ffp);
  157. #endif
  158. #ifdef UNIX
  159.     i = write (ffp, buf, nbuf);
  160. #endif
  161. #ifdef AMIGA
  162.     i = write (ffp, buf, nbuf);
  163. #endif
  164.  
  165.     if ((i != nbuf)
  166. #ifdef MSDOS    
  167.         || (ferror (ffp) != FALSE))
  168. #else
  169.         )
  170. #endif     
  171.             {
  172.             err_echo (MSG_wr_io_er);
  173.             return (FIOERR);
  174.         }
  175.     return (FIOSUC);
  176. }
  177.  
  178. /*
  179. * Read a line from a file, and store the bytes
  180. * in the supplied buffer. Stop on end of file or after 'nbuf' characters. pvr
  181. * the first byte in the buffer is the length in bytes.
  182. */
  183. char    ffgetline (buf, nbuf, rbuf)
  184. register char   *buf;
  185. register LPOS   *rbuf, nbuf;
  186. {
  187. #ifdef MSDOS
  188.     *rbuf = fread (buf, 1, nbuf, ffp);
  189. #endif
  190.  
  191. #ifdef UNIX
  192.     *rbuf = read (ffp, buf, nbuf);
  193. #endif
  194. #ifdef AMIGA
  195.     *rbuf = read (ffp, buf, nbuf);
  196. #endif
  197.  
  198.     /* End of file.         */
  199. #ifdef MSDOS
  200.     if (ferror (ffp) != FALSE)
  201.     {
  202.         err_echo (MSG_rd_er);
  203.         return (FIOERR);
  204.     }
  205. #endif
  206.     if (*rbuf == 0)
  207.         return (FIOEOF);
  208.  
  209.     return (FIOSUC);
  210. }
  211.  
  212. /*
  213. *   Seek to specified position in file.
  214. *   Return the actual position in the file.
  215. */
  216. A32     ffseek (posn)
  217. A32     posn;
  218. {
  219. #ifdef MSDOS
  220.     fseek (ffp, posn, SEEK_SET);
  221.     return (ftell (ffp));
  222. #endif
  223. #ifdef UNIX
  224.     return (lseek (ffp, posn, 0));
  225. #endif
  226. #ifdef AMIGA
  227.     return (lseek (ffp, posn, 0));
  228. #endif
  229. }
  230.  
  231. /*
  232. * Some backup user on MS-DOS might want
  233. * to determine some rule for doing backups on that
  234. * system, and fix this. I don't use MS-DOS, so I don't
  235. * know what the right rules would be. Return TRUE so
  236. * the caller does not abort a write.
  237. * Under UNIX just append the .bak postfix.
  238. */
  239. #ifdef BACKUP
  240. bool    fbackupfile (fname)
  241. char   *fname;
  242. {
  243.     char    backname[NFILEN];
  244.     char   *source,
  245.     *backup;
  246.     char    buf[NCOL];
  247.  
  248.     source = fname;
  249.     backup = backname;
  250.     while ((*source > 0)
  251. #ifdef MSDOS
  252.         && (*source != '.'))
  253. #else
  254.         )
  255. #endif
  256.             {
  257.             *backup = *source;
  258.             backup++;
  259.             source++;
  260.             *backup = 0;
  261.         }
  262.     strcat (backname, MSG_bak);
  263.     sprintf (buf, MSG_backup, fname, backname);
  264.     writ_echo (buf);
  265.     unlink (backname);
  266. #ifdef NORENAME
  267.     if ((link (fname, backname) != 0) || (unlink (fname) != 0))
  268. #else
  269.         if (rename (fname, backname) > 0)
  270. #endif
  271.         {
  272.             sprintf (buf, MSG_back_er, fname, backname);
  273.             err_echo (buf);
  274.             return (FALSE);
  275.         }
  276.     return (TRUE);              /* Hack.                */
  277. }
  278.  
  279. #endif
  280.  
  281. /*
  282. * The string "fn" is a file name.
  283. * Perform any required case adjustments. All systems
  284. * we deal with so far have case insensitive file systems.
  285. * We zap everything to lower case. The problem we are trying
  286. * to solve is getting 2 buffers holding the same file if
  287. * you visit one of them with the "caps lock" key down.
  288. * On UNIX and AMIGA file names are dual case, so we leave
  289. * everything alone.
  290. */
  291. void    adjustcase (fn)
  292. register char  *fn;
  293. {
  294.     register int    c;
  295.  
  296.     while ((c = *fn) != 0)
  297.     {
  298.         if (c >= 'A' && c <= 'Z')
  299.             *fn = c + 'a' - 'A';
  300.         ++fn;
  301.     }
  302. }
  303.